perm filename VIX2SX.FAI[VIS,HPM] blob sn#187099 filedate 1975-11-07 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00006 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002		TITLE	VIX2SB
C00009 00003	X1←←A ↔ Y1←←B ↔ X2←←C ↔ Y2←←D ↔ BT←ARRY2
C00014 00004	GRYUP:	0
C00015 00005	TONUP:	0
C00016 00006	TABLES FOR FRACTIONATING ERRORS FOR THE HALFTONE ALGORITHM
C00020 ENDMK
C⊗;
	TITLE	VIX2SB
	EXTERN	XL,YH,XSC,YSC
	EXTERN	SLINE,DBUF,BSK
	EXTERN	CORGET,CORREL
	ENTRY	VID

DWINXL:	0
DWINYL:	0
DWINXH:	20*40-2
DWINYH:	740-1

	PCLN←←0
	PCWD←←1
	PCBY←←2
	PCBYA←←3
	LNWD←←4
	LNBY←←5
	LNBYA←←6
	WDBY←←7
	WDBI←←10
	BYBI←←11
	BPTAB←←12
	LINTAB←←13

	T←1  ↔  TT←2  ↔  TTT←3  ↔  ARRY1←4  ↔  ARRY2←5  ↔  P←17
	A←6  ↔  B←7  ↔  C←10  ↔  D←11  ↔  E←13  ↔  F←14  ↔  G←15

RETAD:	0
TEMP:	BLOCK	25		;TEMPORARY STORAGE FOR STUFF

	DEFINE	FLOAT(N)
<	TLC	N,232000
	FADR	N,N	>

	OPDEF	FIX[247000233000]
X1←←A ↔ Y1←←B ↔ X2←←C ↔ Y2←←D ↔ BT←ARRY2
THIS←←TT ↔ SIZ←←TTT

XCNTR←←TEMP ↔ YCNTR←←TEMP+1 ↔ DELX←←TEMP+2 ↔ DELY←←TEMP+3
PICX←←TEMP+4 ↔ PICY←←TEMP+5 ↔ DDLIN←←TEMP+6 ↔ LINB←←TEMP+7

VID:	POP	P,RETAD		;PUT UP BITS BT (A MASK, USUALLY ONLY ONE BIT
	POP	P,BT		;IS ON, IF MULTIPLE BITS ARE ON, THEY ARE OR'D)
	POP	P,ARRY1		;OF PICTURE PIC INTO DD RECTANGLE X1-X2,Y1-Y2
	POP	P,Y2		; VIDEO(X1,Y1,X2,Y2,PIC,BT)
	FSBR	Y2,YH		;IF BT IS -1,
	FMPR	Y2,YSC		;PUT UP A RANDOM DOT REPRESENTATION INSTEAD
	FIX	Y2,
	POP	P,X2
	FSBR	X2,XL
	FMPR	X2,XSC
	FIX	X2,
	POP	P,Y1
	FSBR	Y1,YH
	FMPR	Y1,YSC
	FIX	Y1,
	POP	P,X1
	FSBR	X1,XL
	FMPR	X1,XSC
	FIX	X1,

	CAML	X1,X2			;PUT UP THE BITS MASKED BY BT
	EXCH	X1,X2			;OF PICTURE ARRY IN DD BUFFER
	CAML	Y1,Y2			;RECTANGLE X1-X2, Y1-Y2
	EXCH	Y1,Y2
	HRREI	T,1(X2)			;CALCULATE WIDTH AND HEIGHT,
	SUB	T,X1			;IN DATA DISC PIXELS,
	MOVEM	T,XCNTR			;OF THE FULL PICTURE
	HRREI	T,1(Y2)
	SUB	T,Y1			;THEN CALCULATE THE
	MOVEM	T,YCNTR			;STEP SIZE THROUGH THE ORIGINAL
	HRLZ	T,LNBY(ARRY1)		;PICTURE EACH DD PIXEL REPRESENTS,
	IDIV	T,XCNTR			;AS A FIXED POINT WRD WITH THE
	MOVEM	T,DELX			;RADIX POINT IN THE MIDDLE
	HRLZ	T,PCLN(ARRY1)
	IDIV	T,YCNTR
	MOVEM	T,DELY

	SETZ	PICY
	CAML	Y1,DWINYL		;CHECK IF LOWER AND UPPER
	JRST	YLOK
	MOVN	T,Y1			;BOUNDS OF THE IMAGE EXCEED THE
	IMUL	T,DELY			;EXTERNAL WINDOWING CONSTRAINTS
	MOVEM	T,PICY
	MOVE	Y1,DWINYL
YLOK:	CAMLE	Y2,DWINYH
	MOVE	Y2,DWINYH

	SETZ	PICX
	CAML	X1,DWINXL
	JRST	XLOK
	MOVN	T,X1
	IMUL	T,DELX
	MOVEM	T,PICX
	MOVE	X1,DWINXL
XLOK:	CAMLE	X2,DWINXH
	MOVE	X2,DWINXH

	CAMG	X1,X2			;IF THIS PROCESS LEAVES NOTHING,
	CAMLE	Y1,Y2			;WE CAN QUIT
	JRST	@RETAD

	SUBM	X1,X2			;GENERATE LOOP COUNTERS
	SUBM	Y1,Y2
	HRLI	X1,-1(X2)
	HRLI	Y1,-1(Y2)

	HLRE	SIZ,Y1
	MOVN	SIZ,SIZ			;RESERVE SPACE FOR BYTE PNTR TABLE
	PUSHJ	P,CORGET
	HALT
	MOVEM	THIS,DDLIN

	MOVE	E,DELY
	MOVE	T,Y1			;GENERATE TABLE OF LINE ADDRESSES
	HRR	T,DDLIN
	HRLZI	TT,LINTAB(ARRY1)
	ADD	TT,PICY

YLLP:	HLRZ	TTT,TT			;INTO THE ACTUAL PICTURE COLUMNS WHICH
RTF:	MOVE	TTT,(TTT)		;CORRESPOND TO DD COLUMNS
	MOVEM	TTT,(T)
	ADD	TT,E
	AOBJN	T,YLLP


	CAMN	BT,[-1]
	JRST	[	JSR	TONUP
			JRST	DONE  ]
	CAMN	BT,[-2]
	JRST	[	JSR	HAFUP
			JRST	DONE  ]
	JSR	GRYUP

DONE:	MOVE	THIS,DDLIN
	PUSHJ	P,CORREL
	JRST	@RETAD
GRYUP:	0
	HRRM	BT,TI
	MOVN	T,Y1
	ADD	T,DDLIN
	HRRM	T,YLP

	HRLZ	E,BPTAB(ARRY1)
	ADD	E,PICX

XLP:	HRRZ	T,X1
	LSH	T,-5
	ADD	T,[ORM F,DBUF(TT)]
	HRRM	T,TJ
	HRRZ	F,X1
	ANDI	F,37
	MOVE	F,BSK(F)
	MOVE	T,Y1
	HLRZ	TTT,E
	MOVE	TTT,(TTT)
	TLO	TTT,TT			;SET UP INDEX FIELD IN BYTE PNTR

YLP:	MOVE	TT,(T)			;ALTERED TO REFERENCE THE DDLIN TABLE
	LDB	0,TTT
	MOVE	TT,SLINE(T)
TI:	TRNE	0,BT			;REPLACED BY ACTUAL MASK
TJ:	ORM	F,DBUF(TT)		;ADD WORD NUMBER TπTHIN SCANLINE
	AOBJN	T,YLP

	ADD	E,DELX
	AOBJN	X1,XLP
	JRST	@GRYUP
TONUP:	0
	MOVN	BT,BYBI(ARRY1)
	SUBI	BT,1
	HRRM	BT,TI1
	MOVEI	BT,77753

	MOVN	T,Y1
	ADD	T,DDLIN
	HRRM	T,YLP1

	HRLZ	E,BPTAB(ARRY1)
	ADD	E,PICX

XLP1:	HRRZ	T,X1
	LSH	T,-5
	ADD	T,[ORM F,DBUF(TT)]
	HRRM	T,TJ1
	HRRZ	F,X1
	ANDI	F,37
	MOVE	F,BSK(F)
	MOVE	T,Y1
	HLRZ	TTT,E
	MOVE	TTT,(TTT)
	TLO	TTT,TT			;SET UP INDEX FIELD IN BYTE PNTR

YLP1:	MOVE	TT,(T)			;ALTERED TO REFERENCE THE DDLIN TABLE
	LDB	0,TTT
	MOVE	TT,SLINE(T)
TI1:	ROT	0,-5			;REPLACED BY ACTUAL MASK
	IMULI	BT,400003
	CAMLE	0,BT
TJ1:	ORM	F,DBUF(TT)		;ADD WORD NUMBER WITHIN SCANLINE
	AOBJN	T,YLP1

	ADD	E,DELX
	AOBJN	X1,XLP1
	JRST	@TONUP
;TABLES FOR FRACTIONATING ERRORS FOR THE HALFTONE ALGORITHM

	FOR I←-20,-1,1  {   (3*I+10)/20
					}
T1:	FOR I←0,40,1    {   (3*I+10)/20
					}

	FOR I←-20,-1,1  {   (5*I+10)/20
					}
T2:	FOR I←0,40,1    {   (5*I+10)/20
					}

	FOR I←-20,-1,1  {    (I+10)/20
					}
T3:	FOR I←0,40,1    {    (I+10)/20
					}

	FOR I←-20,-1,1  {I-(((3*I+10)/20)+((5*I+10)/20)+((I+10)/20))
								}
T4:	FOR I←0,40,1    {I-(((3*I+10)/20)+((5*I+10)/20)+((I+10)/20))
								}



HAFUP:	0				;HIGH QUALITY HALFTONES
	HLRE	SIZ,Y1
	MOVN	SIZ,SIZ
	ADDI	SIZ,2
	PUSHJ	P,CORGET
	HALT
	SETZ	(THIS)			;RESERVE AND CLEAR A
	HRL	0,THIS			;LINE BUFFER
	HRRI	0,1(THIS)
	MOVEI	T,-1(THIS)
	ADD	T,SIZ
	BLT	0,(T)

	MOVEM	THIS,LINB		;CREATE REFERENCES TO THE
	SUBI	THIS,(Y1)		;LINE BUFFER
	HRRM	THIS,LBM1
	ADDI	THIS,1
	HRRM	THIS,LB
	ADDI	THIS,1
	HRRM	THIS,LBP1

	MOVN	T,Y1
	ADD	T,DDLIN
	HRRM	T,YLP2

	MOVN	T,BYBI(ARRY1)		;SET UP SHIFT COUNT
	ADDI	T,4			;FOR REDUCTION OF PIXELS
	HRRM	T,SHIF			;TO FOUR BITS

	HRLZ	E,BPTAB(ARRY1)
	ADD	E,PICX

XLP2:	HRRZ	T,X1
	LSH	T,-5
	ADD	T,[ORM F,DBUF(TT)]
	HRRM	T,TJ2
	HRRZ	F,X1
	ANDI	F,37
	MOVE	F,BSK(F)
	MOVE	T,Y1
	HLRZ	TTT,E
	MOVE	TTT,(TTT)
	TLO	TTT,TT			;SET UP INDEX FIELD IN BYTE PNTR

	SETZB	C,D
YLP2:	MOVE	TT,(T)			;ALTERED TO REFERENCE THE DDLIN TABLE
	LDB	0,TTT
SHIF:	LSH	0,0			;STRIP IT TO FOUR BITS
	ADD	C,0
	ADD	C,D
	CAIGE	C,10
	JRST	NOTDOT
	MOVE	TT,SLINE(T)
TJ2:	ORM	F,DBUF(TT)		;ADD WORD NUMBER WITHIN SCANLINE
	SUBI	C,17
NOTDOT:	CAMGE	C,[-20]
FOOL:	MOVE	C,[-20]
	CAILE	C,40
FOOG:	MOVEI	C,40
	MOVE	D,T4(C)
	MOVE	0,T1(C)
LBM1:	ADDM	0,-1(T)			;CHANGED TO LINE BUFFER-1
	MOVE	0,T2(C)
LB:	ADDM	0,(T)			;CHANGED TO LINE BUFFER
	MOVE	C,T3(C)
LBP1:	EXCH	C,1(T)			;CHANGED TO LINE BUFFER+1
	AOBJN	T,YLP2

	ADD	E,DELX
	AOBJN	X1,XLP2

	MOVE	THIS,LINB
	PUSHJ	P,CORREL

	JRST	@HAFUP

	END